package 数组算法;

public class searchRange34 {

    public int[] searchRange(int[] nums, int target) {
        // 左边的最开始的位置
        int leftIdx = binarySearch(nums, target, true);
        // 右边最开始的位置
        int rightIdx = binarySearch(nums, target, false) - 1;

        if (leftIdx <= rightIdx && rightIdx < nums.length && nums[leftIdx] == target && nums[rightIdx] == target) {
            return new int[]{leftIdx, rightIdx};
        }
        return new int[]{-1, -1};
    }

    // 如果是左边那就是的左边第一个安安鱼等于的第一个数 如果是右边那就是大于该数的第一个数的后一个位置
    private int binarySearch(int[] nums, int target, boolean lower) {
        int left = 0;
        int right = nums.length - 1;
        int ans = nums.length;
        while (left <= right) {
            int mid = (left + right) >> 1;
            // 通过的lower的真假来控制的 具体的nums[mid] >= taget 还是的nums[mid]< target
            if (nums[mid] > target || (lower && nums[mid] >= target)) {
                right = mid - 1;
                ans = mid;
            } else {
                left = mid + 1;
            }
        }
        return ans;
    }
}
